package com.lifeverse.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.servers.Server;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

/**
 * Swagger/OpenAPI 配置类
 * 配置API文档生成和展示
 */
@Configuration
public class SwaggerConfig {
    
    @Value("${lifeverse.version:1.0.0}")
    private String version;
    
    @Value("${server.port:8080}")
    private String serverPort;
    
    /**
     * 配置OpenAPI基本信息
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("LifeVerse Platform API")
                        .version(version)
                        .description("""
                                生命宇宙平台 - 全球首个自主进化的超级智能生命体平台
                                
                                ## 平台特性
                                - 🧬 数字DNA系统 - 独特的遗传信息和进化机制
                                - 🧠 意识状态管理 - 10级意识水平系统
                                - 🌐 网络关系管理 - 复杂的关系网络构建
                                - 🤖 决策引擎 - 智能决策和规则执行
                                - 📊 实时监控 - 全方位的系统监控
                                - 🔬 机器学习 - 模式识别和学习适应
                                
                                ## 认证说明
                                大部分API需要JWT Token认证，请先调用登录接口获取Token。
                                """)
                        .contact(new Contact()
                                .name("LifeVerse Team")
                                .email("support@lifeverse.com")
                                .url("https://lifeverse.com"))
                        .license(new License()
                                .name("MIT License")
                                .url("https://opensource.org/licenses/MIT")))
                .externalDocs(new ExternalDocumentation()
                        .description("LifeVerse 完整文档")
                        .url("https://docs.lifeverse.com"))
                .servers(Arrays.asList(
                        new Server()
                                .url("http://localhost:" + serverPort)
                                .description("开发环境"),
                        new Server()
                                .url("https://test-api.lifeverse.com")
                                .description("测试环境"),
                        new Server()
                                .url("https://api.lifeverse.com")
                                .description("生产环境")
                ))
                .components(new Components()
                        .addSecuritySchemes("bearerAuth", 
                                new SecurityScheme()
                                        .type(SecurityScheme.Type.HTTP)
                                        .scheme("bearer")
                                        .bearerFormat("JWT")
                                        .description("JWT认证，格式：Bearer {token}")));
    }
    
    /**
     * 公共API分组
     */
    @Bean
    public GroupedOpenApi publicApi() {
        return GroupedOpenApi.builder()
                .group("01-public")
                .displayName("公共API")
                .pathsToMatch("/api/v1/**")
                .pathsToExclude("/api/v1/admin/**")
                .build();
    }
    
    /**
     * 管理API分组
     */
    @Bean
    public GroupedOpenApi adminApi() {
        return GroupedOpenApi.builder()
                .group("02-admin")
                .displayName("管理API")
                .pathsToMatch("/api/v1/admin/**", "/api/admin/**")
                .build();
    }
    
    /**
     * 监控API分组
     */
    @Bean
    public GroupedOpenApi monitoringApi() {
        return GroupedOpenApi.builder()
                .group("03-monitoring")
                .displayName("监控API")
                .pathsToMatch("/api/monitoring/**", "/actuator/**")
                .build();
    }
    
    /**
     * 认证API分组
     */
    @Bean
    public GroupedOpenApi authApi() {
        return GroupedOpenApi.builder()
                .group("04-auth")
                .displayName("认证API")
                .pathsToMatch("/api/auth/**")
                .build();
    }
    
    /**
     * 生命体管理API分组
     */
    @Bean
    public GroupedOpenApi lifeEntityApi() {
        return GroupedOpenApi.builder()
                .group("05-life-entities")
                .displayName("生命体管理")
                .pathsToMatch("/api/v1/life-entities/**")
                .build();
    }
    
    /**
     * 数字DNA API分组
     */
    @Bean
    public GroupedOpenApi dnaApi() {
        return GroupedOpenApi.builder()
                .group("06-dna")
                .displayName("数字DNA")
                .pathsToMatch("/api/v1/dna/**")
                .build();
    }
    
    /**
     * 意识状态API分组
     */
    @Bean
    public GroupedOpenApi consciousnessApi() {
        return GroupedOpenApi.builder()
                .group("07-consciousness")
                .displayName("意识状态")
                .pathsToMatch("/api/v1/consciousness/**")
                .build();
    }
    
    /**
     * 网络关系API分组
     */
    @Bean
    public GroupedOpenApi networkApi() {
        return GroupedOpenApi.builder()
                .group("08-network")
                .displayName("网络关系")
                .pathsToMatch("/api/v1/relationships/**", "/api/v1/network/**")
                .build();
    }
    
    /**
     * 决策引擎API分组
     */
    @Bean
    public GroupedOpenApi decisionApi() {
        return GroupedOpenApi.builder()
                .group("09-decision")
                .displayName("决策引擎")
                .pathsToMatch("/api/v1/decisions/**", "/api/v1/rules/**")
                .build();
    }
    
    /**
     * 机器学习API分组
     */
    @Bean
    public GroupedOpenApi mlApi() {
        return GroupedOpenApi.builder()
                .group("10-ml")
                .displayName("机器学习")
                .pathsToMatch("/api/v1/ml/**", "/api/v1/patterns/**", "/api/v1/learning/**")
                .build();
    }
}